/**
 * Essa classe vai conter as acoes de um gerente. Ela vai receber os dados da vista
 * e somente ela vai lidar com o banco de dados.
 */

package controlador;

import java.sql.SQLException;
import java.util.HashSet;
import modelo.*;

public class SistemaGerente {
	private DBController db;
	private static SistemaGerente instanciaUnica = null;
	
	/**
	 * Verifica se nao ha nenhuma instancia em execucao desse controlador
	 * e cria um novo caso nao exista.
	 */
	public static SistemaGerente getInstance(Funcionario f) throws SQLException {
		// Verifica tambem se o funcionario e mesmo gerente, mais uma vez.
		if (instanciaUnica == null && f.isGerente()){
			instanciaUnica = new SistemaGerente(f);			
		}
		return instanciaUnica;
	}
	
	private SistemaGerente(Funcionario f) throws SQLException {
		db = DBController.getInstance();
	}
	
	// Metodos que dependem do banco de dados. Eu os recrio aqui
	// para que em momento nenhum seja necessario chamar diretamente
	// o banco de dados, e apenas para as funcoes devidas serem usadas
	// de acordo com o nivel de acesso (caixa ou gerente)
	
	
	public void fechar() throws SQLException {
		db.fecharBD();
	}
	
	// Metodos relacionados a funcionarios
	
	public void addFuncionario(Funcionario f) throws EntradaDuplicadaException {
		db.addFuncionario(f);
	}
	
	public Funcionario getFuncionario(String login) throws EntradaNaoEncontradaException {
		return db.getFuncionario(login);
	}
	
	public HashSet<Funcionario> getFuncionarios() {
		return db.getFuncionarios();
	}
	
	public void removeFuncionario(String login) throws EntradaNaoEncontradaException {
		db.removeFuncionario(login);
	}
	
	public void atualizaFuncionario(Funcionario func) throws EntradaNaoEncontradaException {
		db.atualizaFuncionario(func);
	}
	
	// Metodos relacionadas a produtos
	
	public void addProduto(Produto p) throws EntradaDuplicadaException {
		db.addProduto(p);
	}
	
	public HashSet<Produto> getProdutos() {
		return db.getProdutos();
	}
	
	public void removeProduto(int codigo) throws EntradaNaoEncontradaException {
		db.removeProduto(codigo);
	}
	
	public void atualizaProduto(Produto p) throws EntradaNaoEncontradaException {
		db.atualizaProduto(p);
	}

}
